home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / BNU22SR1.ZIP / src / binutils.2 / bfd / aout-tar.h < prev    next >
C/C++ Source or Header  |  1993-05-30  |  13KB  |  422 lines

  1. /* Define a target vector and some small routines for a variant of a.out.
  2.    Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
  3.  
  4. This file is part of BFD, the Binary File Descriptor library.
  5.  
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "aout/aout64.h"
  21. #include "aout/stab_gnu.h"
  22. #include "aout/ar.h"
  23. /*#include "libaout.h"*/
  24.  
  25. extern CONST struct reloc_howto_struct * NAME(aout,reloc_type_lookup) ();
  26.  
  27. /* Set parameters about this a.out file that are machine-dependent.
  28.    This routine is called from some_aout_object_p just before it returns.  */
  29. #ifndef MY_callback
  30. static bfd_target *
  31. DEFUN(MY(callback),(abfd),
  32.       bfd *abfd)
  33. {
  34.   struct internal_exec *execp = exec_hdr (abfd);
  35.  
  36.   /* Calculate the file positions of the parts of a newly read aout header */
  37.   obj_textsec (abfd)->_raw_size = N_TXTSIZE(*execp);
  38.  
  39.   /* The virtual memory addresses of the sections */
  40.   obj_textsec (abfd)->vma = N_TXTADDR(*execp);
  41.   obj_datasec (abfd)->vma = N_DATADDR(*execp);
  42.   obj_bsssec  (abfd)->vma = N_BSSADDR(*execp);
  43.  
  44.   /* The file offsets of the sections */
  45.   obj_textsec (abfd)->filepos = N_TXTOFF (*execp);
  46.   obj_datasec (abfd)->filepos = N_DATOFF (*execp);
  47.  
  48.   /* The file offsets of the relocation info */
  49.   obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp);
  50.   obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp);
  51.  
  52.   /* The file offsets of the string table and symbol table.  */
  53.   obj_sym_filepos (abfd) = N_SYMOFF (*execp);
  54.   obj_str_filepos (abfd) = N_STROFF (*execp);
  55.   
  56.   /* Determine the architecture and machine type of the object file.  */
  57. #ifdef SET_ARCH_MACH
  58.   SET_ARCH_MACH(abfd, *execp);
  59. #else
  60.   bfd_default_set_arch_mach(abfd, DEFAULT_ARCH, 0);
  61. #endif
  62.  
  63.   /* Don't set sizes now -- can't be sure until we know arch & mach.
  64.      Sizes get set in set_sizes callback, later.  */
  65. #if 0
  66.   adata(abfd).page_size = PAGE_SIZE;
  67. #ifdef SEGMENT_SIZE
  68.   adata(abfd).segment_size = SEGMENT_SIZE;
  69. #else
  70.   adata(abfd).segment_size = PAGE_SIZE;
  71. #endif
  72.   adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE;
  73. #endif
  74.  
  75.   return abfd->xvec;
  76. }
  77. #endif
  78.  
  79. #ifndef MY_object_p
  80. /* Finish up the reading of an a.out file header */
  81.  
  82. static bfd_target *
  83. DEFUN(MY(object_p),(abfd),
  84.      bfd *abfd)
  85. {
  86.   struct external_exec exec_bytes;    /* Raw exec header from file */
  87.   struct internal_exec exec;        /* Cleaned-up exec header */
  88.   bfd_target *target;
  89.  
  90.   if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd)
  91.       != EXEC_BYTES_SIZE) {
  92.     bfd_error = wrong_format;
  93.     return 0;
  94.   }
  95.  
  96.   exec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info);
  97.  
  98.   if (N_BADMAG (exec)) return 0;
  99. #ifdef MACHTYPE_OK
  100.   if (!(MACHTYPE_OK (N_MACHTYPE (exec)))) return 0;
  101. #endif
  102.  
  103.   NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec);
  104.   target = NAME(aout,some_aout_object_p) (abfd, &exec, MY(callback));
  105.  
  106. #ifdef ENTRY_CAN_BE_ZERO
  107.   /* The NEWSOS3 entry-point is/was 0, which (amongst other lossage)
  108.    * means that it isn't obvious if EXEC_P should be set.
  109.    * All of the following must be true for an executable:
  110.    * There must be no relocations, the bfd can be neither an
  111.    * archive nor an archive element, and the file must be executable. */
  112.  
  113.   if (exec.a_trsize + exec.a_drsize == 0
  114.       && bfd_get_format(abfd) == bfd_object && abfd->my_archive == NULL)
  115.     {
  116.       struct stat buf;
  117. #ifndef S_IXUSR
  118. #define S_IXUSR 0100    /* Execute by owner.  */
  119. #endif
  120.       if (stat(abfd->filename, &buf) == 0 && (buf.st_mode & S_IXUSR))
  121.     abfd->flags |= EXEC_P;
  122.     }
  123. #endif /* ENTRY_CAN_BE_ZERO */
  124.  
  125.   return target;
  126. }
  127. #define MY_object_p MY(object_p)
  128. #endif
  129.  
  130.  
  131. #ifndef MY_mkobject
  132. static boolean
  133. DEFUN(MY(mkobject),(abfd),
  134.       bfd *abfd)
  135. {
  136.   if (NAME(aout,mkobject)(abfd) == false)
  137.     return false;
  138. #if 0 /* Sizes get set in set_sizes callback, later, after we know
  139.      the architecture and machine.  */
  140.   adata(abfd).page_size = PAGE_SIZE;
  141. #ifdef SEGMENT_SIZE
  142.   adata(abfd).segment_size = SEGMENT_SIZE;
  143. #else
  144.   adata(abfd).segment_size = PAGE_SIZE;
  145. #endif
  146.   adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE;
  147. #endif
  148.   return true;
  149. }
  150. #define MY_mkobject MY(mkobject)
  151. #endif
  152.  
  153. /* Write an object file.
  154.    Section contents have already been written.  We write the
  155.    file header, symbols, and relocation.  */
  156.  
  157. #ifndef MY_write_object_contents
  158. static boolean
  159. DEFUN(MY(write_object_contents),(abfd),
  160.       bfd *abfd)
  161. {
  162.   struct external_exec exec_bytes;
  163.   struct internal_exec *execp = exec_hdr (abfd);
  164.  
  165. #if CHOOSE_RELOC_SIZE
  166.   CHOOSE_RELOC_SIZE(abfd);
  167. #else
  168.   obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
  169. #endif
  170.  
  171.   WRITE_HEADERS(abfd, execp);
  172.  
  173.   return true;
  174. }
  175. #define MY_write_object_contents MY(write_object_contents)
  176. #endif
  177.  
  178. #ifndef MY_set_sizes
  179. static boolean
  180. DEFUN(MY(set_sizes),(abfd), bfd *abfd)
  181. {
  182.   adata(abfd).page_size = PAGE_SIZE;
  183. #ifdef SEGMENT_SIZE
  184.   adata(abfd).segment_size = SEGMENT_SIZE;
  185. #else
  186.   adata(abfd).segment_size = PAGE_SIZE;
  187. #endif
  188.   adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE;
  189.   return true;
  190. }
  191. #define MY_set_sizes MY(set_sizes)
  192. #endif
  193.  
  194. #ifndef MY_backend_data
  195. static CONST struct aout_backend_data MY(backend_data) = {
  196.   0,                /* zmagic contiguous */
  197.   0,                /* text incl header */
  198.   0,                /* text vma? */
  199.   MY_set_sizes,
  200.   0,                /* exec header is counted */
  201. };
  202. #define MY_backend_data &MY(backend_data)
  203. #endif
  204.  
  205. /* We assume BFD generic archive files.  */
  206. #ifndef    MY_openr_next_archived_file
  207. #define    MY_openr_next_archived_file    bfd_generic_openr_next_archived_file
  208. #endif
  209. #ifndef    MY_generic_stat_arch_elt
  210. #define    MY_generic_stat_arch_elt    bfd_generic_stat_arch_elt
  211. #endif
  212. #ifndef    MY_slurp_armap
  213. #define    MY_slurp_armap            bfd_slurp_bsd_armap
  214. #endif
  215. #ifndef    MY_slurp_extended_name_table
  216. #define    MY_slurp_extended_name_table    _bfd_slurp_extended_name_table
  217. #endif
  218. #ifndef    MY_write_armap
  219. #define    MY_write_armap        bsd_write_armap
  220. #endif
  221. #ifndef    MY_truncate_arname
  222. #define    MY_truncate_arname        bfd_bsd_truncate_arname
  223. #endif
  224.  
  225. /* No core file defined here -- configure in trad-core.c separately.  */
  226. #ifndef    MY_core_file_failing_command
  227. #define    MY_core_file_failing_command _bfd_dummy_core_file_failing_command
  228. #endif
  229. #ifndef    MY_core_file_failing_signal
  230. #define    MY_core_file_failing_signal    _bfd_dummy_core_file_failing_signal
  231. #endif
  232. #ifndef    MY_core_file_matches_executable_p
  233. #define    MY_core_file_matches_executable_p    \
  234.                 _bfd_dummy_core_file_matches_executable_p
  235. #endif
  236. #ifndef    MY_core_file_p
  237. #define    MY_core_file_p        _bfd_dummy_target
  238. #endif
  239.  
  240. #ifndef MY_bfd_debug_info_start
  241. #define MY_bfd_debug_info_start        bfd_void
  242. #endif
  243. #ifndef MY_bfd_debug_info_end
  244. #define MY_bfd_debug_info_end        bfd_void
  245. #endif
  246. #ifndef MY_bfd_debug_info_accumulate
  247. #define MY_bfd_debug_info_accumulate    \
  248.             (void (*) PARAMS ((bfd*, struct sec *))) bfd_void
  249. #endif
  250.  
  251. #ifndef MY_core_file_failing_command
  252. #define MY_core_file_failing_command NAME(aout,core_file_failing_command)
  253. #endif
  254. #ifndef MY_core_file_failing_signal
  255. #define MY_core_file_failing_signal NAME(aout,core_file_failing_signal)
  256. #endif
  257. #ifndef MY_core_file_matches_executable_p
  258. #define MY_core_file_matches_executable_p NAME(aout,core_file_matches_executable_p)
  259. #endif
  260. #ifndef MY_slurp_armap
  261. #define MY_slurp_armap NAME(aout,slurp_armap)
  262. #endif
  263. #ifndef MY_slurp_extended_name_table
  264. #define MY_slurp_extended_name_table NAME(aout,slurp_extended_name_table)
  265. #endif
  266. #ifndef MY_truncate_arname
  267. #define MY_truncate_arname NAME(aout,truncate_arname)
  268. #endif
  269. #ifndef MY_write_armap
  270. #define MY_write_armap NAME(aout,write_armap)
  271. #endif
  272. #ifndef MY_close_and_cleanup
  273. #define MY_close_and_cleanup NAME(aout,close_and_cleanup)
  274. #endif
  275. #ifndef MY_set_section_contents
  276. #define MY_set_section_contents NAME(aout,set_section_contents)
  277. #endif
  278. #ifndef MY_get_section_contents
  279. #define MY_get_section_contents NAME(aout,get_section_contents)
  280. #endif
  281. #ifndef MY_new_section_hook
  282. #define MY_new_section_hook NAME(aout,new_section_hook)
  283. #endif
  284. #ifndef MY_get_symtab_upper_bound
  285. #define MY_get_symtab_upper_bound NAME(aout,get_symtab_upper_bound)
  286. #endif
  287. #ifndef MY_get_symtab
  288. #define MY_get_symtab NAME(aout,get_symtab)
  289. #endif
  290. #ifndef MY_get_reloc_upper_bound
  291. #define MY_get_reloc_upper_bound NAME(aout,get_reloc_upper_bound)
  292. #endif
  293. #ifndef MY_canonicalize_reloc
  294. #define MY_canonicalize_reloc NAME(aout,canonicalize_reloc)
  295. #endif
  296. #ifndef MY_make_empty_symbol
  297. #define MY_make_empty_symbol NAME(aout,make_empty_symbol)
  298. #endif
  299. #ifndef MY_print_symbol
  300. #define MY_print_symbol NAME(aout,print_symbol)
  301. #endif
  302. #ifndef MY_get_lineno
  303. #define MY_get_lineno NAME(aout,get_lineno)
  304. #endif
  305. #ifndef MY_set_arch_mach
  306. #define MY_set_arch_mach NAME(aout,set_arch_mach)
  307. #endif
  308. #ifndef MY_openr_next_archived_file
  309. #define MY_openr_next_archived_file NAME(aout,openr_next_archived_file)
  310. #endif
  311. #ifndef MY_find_nearest_line
  312. #define MY_find_nearest_line NAME(aout,find_nearest_line)
  313. #endif
  314. #ifndef MY_generic_stat_arch_elt
  315. #define MY_generic_stat_arch_elt NAME(aout,generic_stat_arch_elt)
  316. #endif
  317. #ifndef MY_sizeof_headers
  318. #define MY_sizeof_headers NAME(aout,sizeof_headers)
  319. #endif
  320. #ifndef MY_bfd_debug_info_start
  321. #define MY_bfd_debug_info_start NAME(aout,bfd_debug_info_start)
  322. #endif
  323. #ifndef MY_bfd_debug_info_end
  324. #define MY_bfd_debug_info_end NAME(aout,bfd_debug_info_end)
  325. #endif
  326. #ifndef MY_bfd_debug_info_accumulat
  327. #define MY_bfd_debug_info_accumulat NAME(aout,bfd_debug_info_accumulat)
  328. #endif
  329. #ifndef MY_reloc_howto_type_lookup
  330. #define MY_reloc_howto_type_lookup NAME(aout,reloc_type_lookup)
  331. #endif
  332. #ifndef MY_make_debug_symbol
  333. #define MY_make_debug_symbol 0
  334. #endif
  335.  
  336. /* Aout symbols normally have leading underscores */
  337. #ifndef MY_symbol_leading_char 
  338. #define MY_symbol_leading_char '_'
  339. #endif
  340.  
  341. /* Aout archives normally use spaces for padding */
  342. #ifndef AR_PAD_CHAR
  343. #define AR_PAD_CHAR ' '
  344. #endif
  345.  
  346. #ifndef MY_BFD_TARGET
  347. bfd_target MY(vec) =
  348. {
  349.   TARGETNAME,        /* name */
  350.   bfd_target_aout_flavour,
  351. #ifdef TARGET_IS_BIG_ENDIAN_P
  352.   true,                /* target byte order (big) */
  353.   true,                /* target headers byte order (big) */
  354. #else
  355.   false,            /* target byte order (little) */
  356.   false,            /* target headers byte order (little) */
  357. #endif
  358.   (HAS_RELOC | EXEC_P |        /* object flags */
  359.    HAS_LINENO | HAS_DEBUG |
  360.    HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
  361.   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
  362.   MY_symbol_leading_char,
  363.   AR_PAD_CHAR,            /* ar_pad_char */
  364.   15,                /* ar_max_namelen */
  365.   1,                /* minimum alignment */
  366. #ifdef TARGET_IS_BIG_ENDIAN_P
  367.   _do_getb64, _do_getb_signed_64, _do_putb64,
  368.      _do_getb32, _do_getb_signed_32, _do_putb32,
  369.      _do_getb16, _do_getb_signed_16, _do_putb16, /* data */
  370.   _do_getb64, _do_getb_signed_64, _do_putb64,
  371.      _do_getb32, _do_getb_signed_32, _do_putb32,
  372.      _do_getb16, _do_getb_signed_16, _do_putb16, /* hdrs */
  373. #else
  374.   _do_getl64, _do_getl_signed_64, _do_putl64,
  375.      _do_getl32, _do_getl_signed_32, _do_putl32,
  376.      _do_getl16, _do_getl_signed_16, _do_putl16, /* data */
  377.   _do_getl64, _do_getl_signed_64, _do_putl64,
  378.      _do_getl32, _do_getl_signed_32, _do_putl32,
  379.      _do_getl16, _do_getl_signed_16, _do_putl16, /* hdrs */
  380. #endif
  381.     {_bfd_dummy_target, MY_object_p, /* bfd_check_format */
  382.        bfd_generic_archive_p, MY_core_file_p},
  383.     {bfd_false, MY_mkobject,    /* bfd_set_format */
  384.        _bfd_generic_mkarchive, bfd_false},
  385.     {bfd_false, MY_write_object_contents, /* bfd_write_contents */
  386.        _bfd_write_archive_contents, bfd_false},
  387.  
  388.   MY_core_file_failing_command,
  389.   MY_core_file_failing_signal,
  390.   MY_core_file_matches_executable_p,
  391.   MY_slurp_armap,
  392.   MY_slurp_extended_name_table,
  393.   MY_truncate_arname,
  394.   MY_write_armap,
  395.   MY_close_and_cleanup,
  396.   MY_set_section_contents,
  397.   MY_get_section_contents,
  398.   MY_new_section_hook,
  399.   MY_get_symtab_upper_bound,
  400.   MY_get_symtab,
  401.   MY_get_reloc_upper_bound,
  402.   MY_canonicalize_reloc,
  403.   MY_make_empty_symbol,
  404.   MY_print_symbol,
  405.   MY_get_lineno,
  406.   MY_set_arch_mach,
  407.   MY_openr_next_archived_file,
  408.   MY_find_nearest_line,
  409.   MY_generic_stat_arch_elt,
  410.   MY_sizeof_headers,
  411.   MY_bfd_debug_info_start,
  412.   MY_bfd_debug_info_end,
  413.   MY_bfd_debug_info_accumulate,
  414.   bfd_generic_get_relocated_section_contents,
  415.   bfd_generic_relax_section,
  416.   bfd_generic_seclet_link,
  417.   MY_reloc_howto_type_lookup,
  418.   MY_make_debug_symbol,
  419.   (PTR) MY_backend_data,
  420. };
  421. #endif /* MY_BFD_TARGET */
  422.